import json
import logging
import os
from abc import ABC, abstractmethod
from typing import Dict, Any

from 程序核心代码.ast节点.节点定义.基础定义.节点异常定义 import 节点异常

logger = logging.getLogger(__name__)

class 可视化器基类(ABC):
    """可视化器基类，定义通用的可视化功能和接口"""
    
    def __init__(self):
        self.数据: Dict[str, Any] = {}
        self.配置: Dict[str, Any] = {
            "输出目录": "可视化结果",
            "文件格式": "html",
            "主题": "默认",
            "布局": "自动"
        }
        
    @abstractmethod
    def 可视化(self, 数据: Dict[str, Any]) -> str:
        """将数据可视化为指定格式"""
        pass
        
    def 设置配置(self, 配置: Dict[str, Any]) -> None:
        """设置可视化配置"""
        self.配置.update(配置)
        
    def 保存结果(self, 内容: str, 文件名: str) -> str:
        """保存可视化结果到文件"""
        try:
            输出目录 = self.配置["输出目录"]
            if not os.path.exists(输出目录):
                os.makedirs(输出目录)
                
            文件格式 = self.配置["文件格式"]
            完整路径 = os.path.join(输出目录, f"{文件名}.{文件格式}")
            
            with open(完整路径, "w", encoding="utf-8") as f:
                f.write(内容)
                
            return 完整路径
            
        except Exception as e:
            logger.error(f"保存可视化结果失败: {str(e)}")
            raise 节点异常(f"保存可视化结果失败: {str(e)}")
            
    def 加载模板(self, 模板名: str) -> str:
        """加载可视化模板"""
        try:
            模板目录 = os.path.join(os.path.dirname(__file__), "模板")
            模板路径 = os.path.join(模板目录, f"{模板名}.html")
            
            with open(模板路径, "r", encoding="utf-8") as f:
                return f.read()
                
        except Exception as e:
            logger.error(f"加载模板失败: {str(e)}")
            raise 节点异常(f"加载模板失败: {str(e)}")
            
    def 生成图表配置(self, 类型: str, 数据: Dict[str, Any]) -> Dict[str, Any]:
        """生成图表配置"""
        return {
            "type": 类型,
            "data": 数据,
            "options": {
                "theme": self.配置["主题"],
                "layout": self.配置["布局"]
            }
        }
        
    def 转换为JSON(self, 数据: Any) -> str:
        """将数据转换为JSON字符串"""
        try:
            return json.dumps(数据, ensure_ascii=False, indent=2)
        except Exception as e:
            logger.error(f"JSON转换失败: {str(e)}")
            raise 节点异常(f"JSON转换失败: {str(e)}")
            
    def 清理数据(self) -> None:
        """清理可视化数据"""
        self.数据.clear()
        
    def __str__(self) -> str:
        """返回可视化器的字符串表示"""
        return f"{self.__class__.__name__}(主题={self.配置['主题']}, 格式={self.配置['文件格式']})" 